"""
author: jetlin
  date: 2018

python logging 模块的用法

级别			级别数值				使用时机
DEBUG		10				详细信息，常用于调试。
INFO		20				程序正常运行过程中产生的一些信息。
WARNING		30				警告用户，虽然程序还在正常工作，但有可能发生错误。
ERROR		40				由于更严重的问题，程序已不能执行一些功能了。
CRITICAL	50				严重错误，程序已不能继续运行。	


2.3 Handlers处理器
Handlers对象是日志信息的处理器、分发器。它们将日志分发到不同的目的地。
比如有时候我们希望将所有的日志都记录在本地文件内，将error及其以上级别的日志发送到标准输出stdout，
将critical级别的日志以邮件的方法发送给管理员。这就需要同时有三个独立的handler，分别负责一个方向的日志处理。
logging模块使用较多的handlers有两个，StreamHandler和FileHandler。

StreamHandler
标准输出stdout（如显示器）分发器。
创建方法: sh = logging.StreamHandler(stream=None)

FileHandler
将日志保存到磁盘文件的处理器。
创建方法: fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)

handlers对象有下面的方法：
setLevel()：和logger对象的一样，设置日志记录级别。那为什么要设置两层日志级别呢？
logger对象的日志级别是全局性的，对所有handler都有效，相当于默认等级。而handlers的日志级别
只对自己接收到的logger传来的日志有效，进行了更深一层的过滤。

setFormatter()：设置当前handler对象使用的消息格式。
addFilter() 和 removeFilter()：配置或删除一个filter过滤对象

"""

import logging


# 普通用法，记录到文件内
def run_logging_1():
	logging.basicConfig(filename="xxx.log", level=logging.DEBUG)	# 默认追加到文件最后，filemode="w"可清空重写文件
	logging.basicConfig(format="%(asctime)s -- %(levelname)s : %(message)s")		# 指定格式，%(levelname)s是logging模块内置功能。
	logging.debug("it is debug , will be wrote on file")
	logging.info("it is info, will be wrote on file")
	logging.warning("it is warning, will be wrote on file")


# 高级用法
def run_logging():
	# 创建logger记录器
	logger  = logging.getLogger(__name__)
	logger.setLevel(logging.DEBUG)

	# 创建控制台处理器，将日志级别设置为debug
	logs = logging.StreamHandler()		# 
	logs.setLevel(logging.DEBUG)

	file_logs = logging.FileHandler("example.log", mode='a')	# mode为追加模式
	file_logs.setLevel(logging.DEBUG)

	# 创建formatter格式化器
	formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
	file_formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

	logs.setFormatter(formatter)
	file_logs.setFormatter(file_formater)

	logger.addHandler(logs)
	logger.addHandler(file_logs)


	logger.debug('debug message')
	logger.info('info message')
	logger.warn('warn message')
	logger.error('error mesage')
	logger.critical('critical message')


if __name__ == '__main__':
	run_logging()
